package main

import (
	"fmt"
	"os"
	"regexp"
)

func main() {
	//del_2()

	b := []byte{'1', ' ', ' ', '2', '3', '4', '5', ' ', ' '}
	space := TrimSpace(b)
	for i := range space {
		fmt.Println(i)
	}

	Filter(b, func(by byte) bool {
		return by == ' '
	})
}

// 过滤条件原地删除切片元素的算法都可以采用类似的方式处理
func Filter(s []byte, fn func(by byte) bool) []byte {
	b := s[:0]
	for _, v := range s {
		if !fn(v) {
			b = append(b, v)
		}
	}
	return b
}

func del_1() {
	a := []int{1, 2, 3}

	a = a[:len(a)-1]
	fmt.Println(a)

}

func del_2() {
	N := 2
	a := []int{1, 2, 3}
	fmt.Println(a[:0])
	a = append(a[:0], a[1:]...) // 删除开头 1 个元素
	fmt.Println(a)
	a = append(a[:0], a[N:]...) // 删除开头 N 个元素
}

func TrimSpace(s []byte) []byte {
	b := s[:0]
	for _, x := range s {
		if x != ' ' {
			b = append(b, x)
		}

	}
	return b
}

// 这段代码返回的 []byte 指向保存整个文件的数组。因为切片引用了整个原始数组，导致自动垃圾回收器不能及时释放底层数组的空间。
// 一个小的需求可能导致需要长时间保存整个文件数据。这虽然这并不是传统意义上的内存泄漏，但是可能会拖慢系统的整体性能。
func FindPhoneNumber(filename string) []byte {
	file, _ := os.ReadFile(filename)
	return regexp.MustCompile("[0-9]+").Find(file)
}

// 避免切片内存泄漏 数据复制到一个新的切片中
func FindPhoneNumberRepair(filename string) []byte {
	file, _ := os.ReadFile(filename)
	find := regexp.MustCompile("[0-9]+").Find(file)
	return append([]byte{}, find...)
}
